package threshold;

/**
 * @Author wujiaming
 * @Description TODO
 * @Date 2023-03-06 18:45
 * @Version 1.0
 */
public class IsSymmetric {

    /**
     * 这里指的借鉴的思想是：
     * ①对于判断一个树很困难的话，可以理解成有两颗一模一样的树，分别比较两个树对应结点的做孩子和又孩子（对应结点一个树的左孩子另一颗树的右孩子）分别比较这两个结点，都为空则是对称的，有一个不为空则不对称
     * ②对于递归传参的问题，第一次传参无法满足递归，可以将该条件放入返回值
     * 例如程序26行
     * @param p
     * @param q
     * @return
     */
    public boolean isSame(TreeNode p,TreeNode q){
        if(p==null && q==null){
            return true;
        }else if(p==null || q==null){
            return false;
        }
        //第一次传递的参数(q.val==p.val)若有if语句判断，则直接会返回到他上一层调入的函数，不会进入递归作为递归返回的条件，
        //这里可以将if(){return} 语句合并为一个return语句作为递归的返回值，别忘了return (q.val==p.val) 本身也能返回布尔值。
        return (q.val==p.val) && isSame(p.left,q.right) && isSame(p.right,q.left);
    }
     public boolean isSymmetric(TreeNode root) {
        return isSame(root,root);

    }

    public static void main(String[] args) {
         TreeNode root = new TreeNode(1);
        TreeNode node1 = new TreeNode(2);
        TreeNode node2 = new TreeNode(2);
        //TreeNode node3 = new TreeNode(3);
        TreeNode node4 = new TreeNode(4);
        //TreeNode node5 = new TreeNode(4);
        TreeNode node6 = new TreeNode(4);
        root.left=node1;root.right=node2;
        node1.left=null;node1.right=node4;
        node2.left=null;node2.right=node6;
        IsSymmetric test = new IsSymmetric();
        boolean symmetric = test.isSymmetric(root);
        System.out.println(symmetric);
    }
}
